package com.utf999.qiangmanger.controller;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.utf999.qiangmanger.controller.permission.AuthorityAnnotation;
import com.utf999.qiangmanger.controller.permission.AuthorityScope;
import com.utf999.qiangmanger.controller.permission.PromptModeType;
import com.utf999.qiangmanger.entity.JsonEntity;
import com.utf999.qiangmanger.entity.orm.AdminUserEntity;
import com.utf999.qiangmanger.entity.orm.CompanyEntity;
import com.utf999.qiangmanger.entity.orm.StorefrontEntity;
import com.utf999.qiangmanger.exception.BizException;
import com.utf999.qiangmanger.exception.ResponseCode;
import com.utf999.qiangmanger.service.iface.ICompanyService;
import com.utf999.qiangmanger.service.iface.IStorefrontService;

/**
 * @author yinwenjie
 */
@Controller
@RequestMapping(value={"/company"})
public class CompanyController extends BaseController {	
	
	private static Log controllerLog4j = LogFactory.getLog(CompanyController.class);
	
	@Autowired
	private ICompanyService companyService;
	
	@Autowired
	private IStorefrontService storefrontService;
	
	/**
	 * 在超级管理员进行“公司”管理之前，会首先通过这个方法进行数据初始化。
	 * @param request
	 * @param response
	 * @return
	 */
	@RequestMapping(value={"/preCompanyList"})
	@AuthorityAnnotation(scope={AuthorityScope.SuperAdmin} , promptMode=PromptModeType.REDIRECT)
	public ModelAndView preCompanyList(HttpServletRequest request , HttpServletResponse response) throws BizException {
		//查询当前的公司列表信息(无论公司状态 是否“正常”)
		List<CompanyEntity> companys = null;
		companys = this.companyService.queryCompanyList(null);
		request.setAttribute("companys", companys);
		
		ModelAndView mv = new ModelAndView("configuration/companylist");
		return mv;
	} 
	
	/**
	 * 进入“公司维护”操作页面之前，这个方法负责读取数据
	 * @param request
	 * @param response
	 * @return
	 * @throws BizException
	 */
	@RequestMapping(value={"/preCompanyModify"})
	@AuthorityAnnotation(scope={AuthorityScope.SuperAdmin} , promptMode=PromptModeType.REDIRECT)
	public ModelAndView preCompanyModify(HttpServletRequest request , HttpServletResponse response , String companyid) throws BizException {
		CompanyEntity company = null;
		
		//说明是添加操作，否则是修改操作
		//还有公司级管理员的信息
		if(StringUtils.isEmpty(companyid)) {
			company = new CompanyEntity();
		} else {
			company = (CompanyEntity)this.companyService.getEntity(companyid);
		}
		request.setAttribute("company", company);
		
		ModelAndView mv = new ModelAndView("configuration/companyModify");
		return mv;
	}
	
	/**
	 * 这个方法进行公司基本信息的创建或者修改操作
	 * @param request
	 * @param response
	 * @param companyURLFile 可能上传的文件内容信息 
	 * @param uid 以这个uid确定是修改操作还是新增操作
	 * @param createTime 创建时间
	 * @param status 公司状态
	 * @param companyURL 公司的log的http完整访问路径
	 * @param companyName 公司名称
	 * @param industryType 行业类型
	 * @return 修改后者新增成功后，跳转到列表界面
	 * @throws BizException
	 */
	@RequestMapping(value={"/saveCompany"})
	@AuthorityAnnotation(scope={AuthorityScope.SuperAdmin} , promptMode=PromptModeType.REDIRECT)
	public ModelAndView saveCompany(HttpServletRequest request , HttpServletResponse response , @RequestParam("companyURLFile") CommonsMultipartFile companyURLFile , String uid , String createTime , String status , String companyURL , String companyName , String industryType) throws BizException {
		this.companyService.saveCompany(companyURLFile, uid, createTime, status, companyURL, companyName, industryType);
		ModelAndView mv = new ModelAndView("redirect:/company/preCompanyList");
		return mv;
	}
	
	/**
	 * 更改指定公司的状态。在这种情况下，一般是超级管理员禁用/启用公司的使用
	 * @param request
	 * @param response
	 * @param companyid 指定的公司id信息
	 * @return
	 * @throws BizException
	 */
	@RequestMapping(value={"/updateCompanyStatus"})
	@AuthorityAnnotation(scope={AuthorityScope.SuperAdmin} , promptMode=PromptModeType.REDIRECT)
	public ModelAndView updateCompanyStatus(HttpServletRequest request , HttpServletResponse response , String companyid) throws BizException {
		CompanyEntity company = (CompanyEntity)this.companyService.getEntity(companyid);
		if(company.getStatus() == 1) {
			company.setStatus(0);
		} else {
			company.setStatus(1);
		}
		this.companyService.update(company);
		
		ModelAndView mv = new ModelAndView("redirect:/company/preCompanyList");
		return mv;
	}
	
	/**
	 * 查询当前系统中状态“正常”的公司信息（使用ajax的方式进行返回）<br>
	 * 注意，只需要查询 对应的中文名称，唯一id即可<br>
	 * 然后使用自定义的json格式进行返回
	 * @param request 
	 * @param response 
	 * @return
	 */
	@RequestMapping(value={"/queryCompany"})
	@AuthorityAnnotation(scope={AuthorityScope.SuperAdmin,AuthorityScope.CompanyAdmin,AuthorityScope.StoreAdmin} , promptMode=PromptModeType.AJAX)
	public void queryCompany(HttpServletRequest request , HttpServletResponse response) {
		/*
		 * 从request中找到admin元素，
		 * 1、如果这个admin是超级管理员，则查询可用公司的列表（和店面列表）
		 * 2、如果是店面管理员，则查询这个管理员所属的公司（和指定店面列表）
		 * */
		AdminUserEntity adminUser = (AdminUserEntity)request.getAttribute("admin");
		
		List<CompanyEntity> companys = null;
		try {
			if(adminUser.getAdminLevel() == 1) {
				companys = this.companyService.queryCompanyList(1);
			} else {
				CompanyEntity company = this.companyService.queryCompany(adminUser.getUid());
				companys = new ArrayList<CompanyEntity>();
				companys.add(company);
			}
		} catch (BizException e) {
			controllerLog4j.error(e.getMessage(), e);
			JsonEntity jsonEntity = new JsonEntity();
			jsonEntity.setResponsecode(e.getResponseCode());
			jsonEntity.setData("");
			jsonEntity.setErrorinfo(e.getMessage());
			this.writeResponseMsg(response, jsonEntity);
		} 
		
		JsonEntity jsonEntity = new JsonEntity();
		jsonEntity.setData(companys);
		jsonEntity.setResponsecode(ResponseCode.E200);
		this.writeResponseMsg(response, jsonEntity , new String[]{"admins"});
	}
	
	/**
	 * 查询当前系统中状态“正常”的公司信息，和归属的正常的店面信息（使用ajax的方式进行返回）<br>
	 * 注意，只需要查询 对应的中文名称，唯一id即可<br>
	 * 然后使用自定义的json格式进行返回
	 * @param request 
	 * @param response 
	 * @return
	 */
	@RequestMapping(value={"/queryCompanyAndStoreList"})
	@AuthorityAnnotation(scope={AuthorityScope.SuperAdmin,AuthorityScope.CompanyAdmin,AuthorityScope.StoreAdmin} , promptMode=PromptModeType.AJAX)
	public void queryCompanyAndStoreList(HttpServletRequest request , HttpServletResponse response) {
		/*
		 * 从request中找到admin元素，
		 * 1、如果这个admin是超级管理员，则查询可用公司的列表（和店面列表）
		 * 2、如果是公司管理员，则查询这个公司和其下所有的店铺信息
		 * 3、如果是店面管理员，则查询这个管理员所属的公司（和指定店面列表）
		 * */
		AdminUserEntity adminUser = (AdminUserEntity)request.getAttribute("admin");
		
		//=============1、进行查询
		LinkedHashMap<CompanyEntity , List<StorefrontEntity>> companysMapping = new LinkedHashMap<CompanyEntity, List<StorefrontEntity>>();
		try {
			if(adminUser.getAdminLevel() == 1) {
				companysMapping = this.companyService.queryCompanyAndStoreList();
			} else if(adminUser.getAdminLevel() == 2) {
				//TODO 这里有重复判断的问题，但是为了保证大家能够读懂业务，这个问题不算严重
				companysMapping = this.companyService.queryCompanyAndStoreList(adminUser.getUid());
			} else {
				companysMapping = this.companyService.queryCompanyAndStoreList(adminUser.getUid());
			}
		} catch (BizException e) {
			controllerLog4j.error(e.getMessage(), e);
			JsonEntity jsonEntity = new JsonEntity();
			jsonEntity.setResponsecode(e.getResponseCode());
			jsonEntity.setData("");
			jsonEntity.setErrorinfo(e.getMessage());
			this.writeResponseMsg(response, jsonEntity);
		} 
		
		//=============2、结构转换 、只需要公司名称、uid、店面名称、uid这些信息
		Set<CompanyEntity>  companysKeys = companysMapping.keySet();
		JSONArray companysArray = new JSONArray();
		for (CompanyEntity company : companysKeys) {
			JSONObject returnObject = new JSONObject();
			returnObject.put("companyName", company.getCompanyName());
			returnObject.put("companyuid", company.getUid());
			
			List<StorefrontEntity> stores =  companysMapping.get(company);
			JSONArray storeArrays = new JSONArray();
			//店面信息
			for (StorefrontEntity storefront : stores) {
				JSONObject storeObject = new JSONObject();
				storeObject.put("storeName", storefront.getStoreName());
				storeObject.put("storeuid", storefront.getUid());
				storeArrays.add(storeObject);
			}
			returnObject.put("stores", storeArrays);
			companysArray.add(returnObject);
		}
		
		//============3、进行返回
		JsonEntity jsonEntity = new JsonEntity();
		jsonEntity.setData(companysArray);
		jsonEntity.setResponsecode(ResponseCode.E200);
		this.writeResponseMsg(response, jsonEntity);
	}
} 